package com.mogu.biguser.config.shiro;//package com.mogo.workorder.config.shiro;
//
//import com.mogo.workorder.exception.MyExceptionResolver;
//import com.mogo.workorder.shiro.MyShiroRealm;
//import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
//import org.apache.shiro.cache.ehcache.EhCacheManager;
//import org.apache.shiro.mgt.SecurityManager;
//import org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler;
//import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
//import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
//import org.apache.shiro.web.mgt.CookieRememberMeManager;
//import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
//import org.apache.shiro.web.servlet.SimpleCookie;
//import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.core.annotation.Order;
//
//import javax.servlet.Filter;
//import java.util.LinkedHashMap;
//import java.util.Map;
//
///**
// * Description  : Apache Shiro 核心通过 Filter 来实现，就好像SpringMvc 通过DispachServlet 来主控制一样。
// * 既然是使用 Filter 一般也就能猜到，是通过URL规则来进行过滤和权限校验，所以我们需要定义一系列关于URL的规则和访问权限。
// */
//
//@Configuration
//@Order(1)
//public class ShiroConfig2 {
//
//    //配置kaptcha图片验证码框架提供的Servlet,,这是个坑,很多人忘记注册(注意)
//   /* @Bean*/
////    public ServletRegistrationBean kaptchaServlet() {
////        ServletRegistrationBean servlet = new ServletRegistrationBean(new KaptchaServlet(), "/kaptcha.jpg");
////        servlet.addInitParameter(Constants.KAPTCHA_SESSION_CONFIG_KEY, Constants.KAPTCHA_SESSION_KEY);//session key
////        servlet.addInitParameter(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "50");//字体大小
////        servlet.addInitParameter(Constants.KAPTCHA_BORDER, "no");
////        servlet.addInitParameter(Constants.KAPTCHA_BORDER_COLOR, "105,179,90");
////        servlet.addInitParameter(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "45");
////        servlet.addInitParameter(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
////        servlet.addInitParameter(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋体,楷体,微软雅黑");
////        servlet.addInitParameter(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
////        servlet.addInitParameter(Constants.KAPTCHA_IMAGE_WIDTH, "125");
////        servlet.addInitParameter(Constants.KAPTCHA_IMAGE_HEIGHT, "60");
////        //可以设置很多属性,具体看com.google.code.kaptcha.Constants
//////		kaptcha.border  是否有边框  默认为true  我们可以自己设置yes，no
//////		kaptcha.border.color   边框颜色   默认为Color.BLACK
//////		kaptcha.border.thickness  边框粗细度  默认为1
//////		kaptcha.producer.impl   验证码生成器  默认为DefaultKaptcha
//////		kaptcha.textproducer.impl   验证码文本生成器  默认为DefaultTextCreator
//////		kaptcha.textproducer.char.string   验证码文本字符内容范围  默认为abcde2345678gfynmnpwx
//////		kaptcha.textproducer.char.length   验证码文本字符长度  默认为5
//////		kaptcha.textproducer.font.names    验证码文本字体样式  默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
//////		kaptcha.textproducer.font.size   验证码文本字符大小  默认为40
//////		kaptcha.textproducer.font.color  验证码文本字符颜色  默认为Color.BLACK
//////		kaptcha.textproducer.char.space  验证码文本字符间距  默认为2
//////		kaptcha.noise.impl    验证码噪点生成对象  默认为DefaultNoise
//////		kaptcha.noise.color   验证码噪点颜色   默认为Color.BLACK
//////		kaptcha.obscurificator.impl   验证码样式引擎  默认为WaterRipple
//////		kaptcha.word.impl   验证码文本字符渲染   默认为DefaultWordRenderer
//////		kaptcha.background.impl   验证码背景生成器   默认为DefaultBackground
//////		kaptcha.background.clear.from   验证码背景颜色渐进   默认为Color.LIGHT_GRAY
//////		kaptcha.background.clear.to   验证码背景颜色渐进   默认为Color.WHITE
//////		kaptcha.image.width   验证码图片宽度  默认为200
//////		kaptcha.image.height  验证码图片高度  默认为50
////        return servlet;
////    }
//
//    //注入异常处理类
//    @Bean
//    public MyExceptionResolver myExceptionResolver() {
//        return new MyExceptionResolver();
//    }
//
//    /**
//     * ShiroFilterFactoryBean 处理拦截资源文件问题。
//     * 注意：单独一个ShiroFilterFactoryBean配置是或报错的，以为在
//     * 初始化ShiroFilterFactoryBean的时候需要注入：SecurityManager Filter Chain定义说明
//     * 1、一个URL可以配置多个Filter，使用逗号分隔
//     * 2、当设置多个过滤器时，全部验证通过，才视为通过
//     * 3、部分过滤器可指定参数，如perms，roles
//     */
//    @Bean
//    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
//
//        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//        // 必须设置 SecurityManager
//        shiroFilterFactoryBean.setSecurityManager(securityManager);
//        //验证码过滤器
//        Map<String, Filter> filtersMap = shiroFilterFactoryBean.getFilters();
//       /* KaptchaFilter kaptchaFilter = new KaptchaFilter();
//        filtersMap.put("kaptchaFilter", kaptchaFilter);*/
//        //实现自己规则roles,这是为了实现or的效果
//        //RoleFilter roleFilter = new RoleFilter();
//        //filtersMap.put("roles", roleFilter);
//        shiroFilterFactoryBean.setFilters(filtersMap);
//        // 拦截器
//        //rest：比如/admins/user/**=rest[user],根据请求的方法，相当于/admins/user/**=perms[user：method] ,其中method为post，get，delete等。
//        //port：比如/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal：//serverName：8081?queryString,其中schmal是协议http或https等，serverName是你访问的host,8081是url配置里port的端口，queryString是你访问的url里的？后面的参数。
//        //perms：比如/admins/user/**=perms[user：add：*],perms参数可以写多个，多个时必须加上引号，并且参数之间用逗号分割，比如/admins/user/**=perms["user：add：*,user：modify：*"]，当有多个参数时必须每个参数都通过才通过，想当于isPermitedAll()方法。
//        //roles：比如/admins/user/**=roles[admin],参数可以写多个，多个时必须加上引号，并且参数之间用逗号分割，当有多个参数时，比如/admins/user/**=roles["admin,guest"],每个参数通过才算通过，相当于hasAllRoles()方法。//要实现or的效果看http://zgzty.blog.163.com/blog/static/83831226201302983358670/
//        //anon：比如/admins/**=anon 没有参数，表示可以匿名使用。
//        //authc：比如/admins/user/**=authc表示需要认证才能使用，没有参数
//        //authcBasic：比如/admins/user/**=authcBasic没有参数表示httpBasic认证
//        //ssl：比如/admins/user/**=ssl没有参数，表示安全的url请求，协议为https
//        //user：比如/admins/user/**=user没有参数表示必须存在用户，当登入操作时不做检查
//        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
//        // 配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了
//        filterChainDefinitionMap.put("/logout", "logout");
//        //配置记住我或认证通过可以访问的地址
//        filterChainDefinitionMap.put("/index", "user");
//        filterChainDefinitionMap.put("/", "user");
//        filterChainDefinitionMap.put("/login", "anon");
//        // <!-- 过滤链定义，从上向下顺序执行，一般将 /**放在最为下边 -->:这是一个坑呢，一不小心代码就不好使了;
//        //这段是配合 actuator框架使用的，配置相应的角色才能访问
//        // filterChainDefinitionMap.put("/health", "roles[aix]");//服务器健康状况页面
//        // filterChainDefinitionMap.put("/info", "roles[aix]");//服务器信息页面
//        // filterChainDefinitionMap.put("/env", "roles[aix]");//应用程序的环境变量
//        // filterChainDefinitionMap.put("/metrics", "roles[aix]");
//        // filterChainDefinitionMap.put("/configprops", "roles[aix]");
//        //开放的静态资源
//      /*  filterChainDefinitionMap.put("/favicon.ico", "anon");//网站图标
//        filterChainDefinitionMap.put("/static/**", "anon");//配置static文件下资源能被访问的，这是个例子
//        filterChainDefinitionMap.put("/kaptcha.jpg", "anon");//图片验证码(kaptcha框架)
//
//        filterChainDefinitionMap.put("/api/v1/**", "anon");//API接口*/
//
//        // swagger接口文档
//        filterChainDefinitionMap.put("/v2/api-docs", "anon");
//        filterChainDefinitionMap.put("/webjars/**", "anon");
//        filterChainDefinitionMap.put("/swagger-resources/**", "anon");
//        filterChainDefinitionMap.put("/swagger-ui.html", "anon");
//        filterChainDefinitionMap.put("/doc.html", "anon");
//
//        // 其他的
//        filterChainDefinitionMap.put("/**", "authc");
//
//        // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
//        shiroFilterFactoryBean.setLoginUrl("/notifyLogin");
//        // 登录成功后要跳转的链接
//        shiroFilterFactoryBean.setSuccessUrl("/index");
//        // 未授权界面，不生效(详情原因看MyExceptionResolver)
//        shiroFilterFactoryBean.setUnauthorizedUrl("/errorView/403_error.html");
//        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
//        return shiroFilterFactoryBean;
//    }
//
//    @Bean
//    public SecurityManager securityManager() {
//        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//        // 设置realm.
//        securityManager.setRealm(myShiroRealm());
//        //注入缓存管理器
//        securityManager.setCacheManager(ehCacheManager());//这个如果执行多次，也是同样的一个对象;
//        //注入记住我管理器;
//        securityManager.setRememberMeManager(rememberMeManager());
//        return securityManager;
//    }
//
//    /**
//     * 身份认证realm; (这个需要自己写，账号密码校验；权限等)
//     */
//    @Bean
//    public MyShiroRealm myShiroRealm() {
//        MyShiroRealm myShiroRealm = new MyShiroRealm();
//        myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
//        return myShiroRealm;
//    }
//
//    /**
//     * 凭证匹配器 （由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了
//     * 所以我们需要修改下doGetAuthenticationInfo中的代码; @return
//     */
//    @Bean
//    public HashedCredentialsMatcher hashedCredentialsMatcher() {
//        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
//        hashedCredentialsMatcher.setHashAlgorithmName("md5");// 散列算法:这里使用MD5算法;
//        hashedCredentialsMatcher.setHashIterations(2);// 散列的次数，比如散列两次，相当于md5(md5(""));
//        hashedCredentialsMatcher.setStoredCredentialsHexEncoded(true);//表示是否存储散列后的密码为16进制，需要和生成密码时的一样，默认是base64；
//        return hashedCredentialsMatcher;
//    }
//
//    /**
//     * 开启shiro aop注解支持. 使用代理方式; 所以需要开启代码支持;
//     *
//     * @param securityManager
//     * @return
//     */
//    @Bean
//    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
//        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
//        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
//        return authorizationAttributeSourceAdvisor;
//    }
////
// /**
////     * shiro缓存管理器;
////     * 需要注入对应的其它的实体类中：
////     * 1、安全管理器：securityManager
////     * 可见securityManager是整个shiro的核心；
////     *
////     * @return
//     */
//    @Bean
//    public EhCacheManager ehCacheManager() {
//        EhCacheManager cacheManager = new EhCacheManager();
//        cacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");
//        return cacheManager;
//    }
////
////    /**
////     * cookie对象;
////     *
////     * @return
////     */
//    @Bean
//    public SimpleCookie rememberMeCookie() {
//        //System.out.println("ShiroConfiguration.rememberMeCookie()");
//        //这个参数是cookie的名称，对应前端的checkbox的name = rememberMe
//        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
//        //<!-- 记住我cookie生效时间30天 ,单位秒;-->
//        simpleCookie.setMaxAge(259200);
//        return simpleCookie;
//    }
//
//    /**
//     * cookie管理对象;
//     *
//     * @return
//     */
//    @Bean
//    public CookieRememberMeManager rememberMeManager() {
//        //System.out.println("ShiroConfiguration.rememberMeManager()");
//        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
//        cookieRememberMeManager.setCookie(rememberMeCookie());
//        return cookieRememberMeManager;
//    }
//
//    @Bean(name = "sessionManager")
//    public DefaultWebSessionManager defaultWebSessionManager() {
//        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
//        sessionManager.setGlobalSessionTimeout(18000000);
//        // url中是否显示session Id
//        sessionManager.setSessionIdUrlRewritingEnabled(false);
//        // 删除失效的session
//        sessionManager.setDeleteInvalidSessions(true);
//        sessionManager.setSessionValidationSchedulerEnabled(true);
//        sessionManager.setSessionValidationInterval(18000000);
//        sessionManager.setSessionValidationScheduler(getExecutorServiceSessionValidationScheduler());
//        //设置SessionIdCookie 导致认证不成功，不从新设置新的cookie,从sessionManager获取sessionIdCookie
//        //sessionManager.setSessionIdCookie(simpleIdCookie());
//        sessionManager.getSessionIdCookie().setName("session-z-id");
//        sessionManager.getSessionIdCookie().setPath("/");
//        sessionManager.getSessionIdCookie().setMaxAge(60 * 60 * 24 * 7);
//        return sessionManager;
//    }
//
//    @Bean(name = "sessionValidationScheduler")
//    public ExecutorServiceSessionValidationScheduler getExecutorServiceSessionValidationScheduler() {
//        ExecutorServiceSessionValidationScheduler scheduler = new ExecutorServiceSessionValidationScheduler();
//        scheduler.setInterval(900000);
//        return scheduler;
//    }
//
//   /* @Bean(name = "shiroDialect")
//    public ShiroDialec shiroDialect() {
//        return new ShiroDialect();
//    }*/
//
//}
